home *** CD-ROM | disk | FTP | other *** search
- HELPME.TXT - Antworten auf allgemeine Fragen zu StarView
- --------------------------------------------------------
-
- StarView - Allgemein
- --------------------
-
- F: Ich verwende einen Link-Handler und meine Applikation bricht ab.
- A: Da bei der Verwendung eines Links ein Typecast durchgeführt wird,
- kann der Compiler keine Überprüfung der aufgerufenen Methode
- durchführen.
- Folgende Punkte sollten bei der Verwendung eines Links beachtet werden:
- - Jede Methode, die mit einem Link verwendet wird, erhält als
- Argument einen Zeiger auf das aufrufende Objekt.
- Beispiel. Win::ClickHdl( Button* pButton );
- - Jede Methode, die mit einem Link verwendet wird, kann als Ergebnis
- nur einen Wert vom Typ long liefern.
- - Bei Compilern auf verschiedenen Systemen können bestimmte
- Einschränkungen bei der Verwendung von Links bestehen. So sollten
- Links nicht auf Inline- und virtuelle Methoden zeigen. Weiterhin
- kann es bei Klassen mit Mehrfachvererbung zu Problemen führen
-
-
- F: Ich möchte einen String aus der Resource laden, obwohl es in der
- Klasse String keinen Resource-Konstruktor gibt.
- A: Die ResId kann über einen String-Operator einen String aus der
- Resource laden. Beispiel: String aStr( ResId( 4711 ) );
-
-
- F: Ich möchte einen Warte-Mauszeiger anzeigen, da ich eine größere
- Operation durchführe. Leider wird der Mauszeiger nur umgeschaltet,
- wenn sich der Mauszeiger über dem Fenster befindet, in den ich
- den Pointer selektiere.
- A: Um dem Anwender Ihrer Anwendung anzuzeigen, das die Applikation
- derzeit keine Eingaben entgegen nehmen kann, sollten Sie die
- Methode Application::Wait() aufrufen. Auf nicht Multitasking
- fähigen Systemen (Windows 3.x) wird der Wartecursor sofort
- umgeschaltet, da das System solange stillgelegt ist, bis Sie
- die Handler verlassen haben oder Application::Reschedule()
- aufrufen. Auf Multitasking fähigen Systemen (X-Windows) wird
- der Wartecursor nur innerhalb der Applikation angezeigt.
-
-
- F: Mein Programm stürzt beim Programmstart ab. Woran könnte es liegen ?
- A: Die häufigste Fehlerursache ist, daß globale StarView-Instanzen
- angelegt werden. Da die Konstruktoren der globalen Instanzen vor der
- Initialisierung von StarView aufgerufen werden, gibt es Programm-
- abbrüche beim Starten der Applikation. Da die Applikationsinstanz
- global angelegt wird (die einzige Ausnahme), darf Ihre abgeleitete
- Applikationsklasse auch keine StarView-Klassen als Member haben. Sie
- sollten in diesem Fall nur Pointer als Member haben und die Instanzen
- in Main() anlegen.
-
-
- F: Ich will eine Toolbox schreiben, die nicht den Focus bekommt,
- wenn ich mit der Maus in das Fenster klicke und das frei
- verschiebar ist.
- A: Dieser Fenstertyp wird nicht von StarView und nicht von den
- Fenstersystemen unterstützt. Z.B. gibt es unter Windows keine
- Fenster, die nicht aktiv werden, wenn man in das Fenster klickt.
- Was unterstützt wird, ist ein Fenster innerhalb einer
- MDI-Applikation das als Parent das Applikationsfenster hat. Das
- Fenster sollte am Rand des Applikationsfenster positioniert werden:
-
- class ToolBar : public Window
- {
- public:
- ToolBar() : Window( pApp->GetAppWindow(), WinBits( 0 ) ) {}
- ...
- };
-
- void AppWin::Resize()
- {
- // Da das Fenster nicht frei verschiebar ist, wird es
- // am linken Rand des Applikationsfensters positioniert.
- pToolBar->
- ChangeSizePixel( Size( pToolBar->GetSizePixel().Width(),
- GetOutputSizePixel().Height() ) );
- }
-
-
- F: ???
- A: Viele Fragen können auch im systemabhängigen Teil beantwortet sein,
- wobei viele Antworten auch für andere Systeme zutreffen. Deshalb
- sollten Sie auch die systemabhängigen Teile durchlesen.
-
-
- StarView für Windows
- --------------------
-
- F: Ich möchte eine FileOpen-Dialogbox implementieren. Leider gibt es in
- StarView keine Unterstützung vom Filesystem.
- A: In dieser Version unterstützt StarView nicht das Filesystem. Um den
- FileDialog von Windows 3.1 zu benutzen, können Sie das Programm
- \EXAMPLES\FILEDLG verwenden, das auch den Einsatz der Sysdepen-
- Klasse demonstiert. Für Datei Ein- und Ausgabefunktionen sollten Sie
- die Streams benutzen. Für die Verzeichnisanzeige sollten Sie Sich
- folgendermaßen helfen:
-
- #include <sysdep.hxx>
-
- void MyListBox::InsertDir( const String& rPfad )
- {
- SendMessage( Sysdepen::GethWnd( *this ), // Windowhandle
- LB_DIR, // Verzeichnis
- 0, // Attribute (Windows-Referenz: DlgDirList)
- (long)(const char*)rPfad ); // Pfad inkl. WildCards
- }
-
-
- F: Wenn ich den KeyInput-Handler überlagere, kann ich die Applikation
- unter Windows nicht mehr über Alt+F4 beeenden oder über die Alt-Tasten
- das Menü aktivieren.
- A: Da an den KeyInput-Handler alle Tasten übergeben werden, müssen Sie
- die Tasten auswerten, die Sie in Ihrem Programm verwenden. Alle
- anderen KeyEvents müssen Sie an das System weiterleiten, in dem
- Sie den KeyInput-Handler der Basisklasse rufen:
-
- class MyWindow : public WorkWindow
- {
- ...
- void KeyInput( const KeyEvent& rEvt );
- ...
- };
-
- void MyEdit::KeyInput( const KeyEvent& rEvt )
- {
- switch ( rEvt.GetKeyCode().GetCode() )
- {
- case KEY_LEFT:
- ...
- break;
- ...
- default:
- // Zeichencode ohne Alt-Taste
- if ( !rEvt.IsMod2() && rEvt.GetCharCode() )
- ...
- else
- WorkWindow::KeyInput( rEvt );
- }
- }
-
-
- F: Ich habe den KeyInput-Handler vom SingleLineEdit aufgerufen und
- einen eigenen KeyEvent übergeben. Das Editfeld bekommt leider
- nicht die Taste.
- A: Da haben Sie leider recht. Dies ist ein Problem, wofür wir
- noch keine Lösung habem. Dieses Problem gilt auch für
- alle anderen Controls und auch für die Maus-Handler.
-
-
- F: Damit der Benutzer bei falscher Eingabe nicht das Editfeld verlassen
- kann, habe ich im LooseFocus-Handler eine Prüfroutine implementiert,
- die im Fehlerfall den Focus wieder auf das Editfeld setzt. Dabei
- kam die Focussteuerung leider durcheinander.
- A: Dabei kommt leider Windows durcheinander. Was von StarView
- angeboten wird, ist folgende Lösung:
-
- class MyEdit : public SingleLineEdit
- {
- ...
- void KeyInput( const KeyEvent& rEvt );
- ...
- };
-
- void MyEdit::KeyInput( const KeyEbent& rEvt )
- {
- // Umlaute dürfen nicht eingegeben werden
- if ( (unsigned char)rEvt.GetCharCode() > 127 )
- Sound::Beep();
- else
- // Alle anderen Tasten an das Editfeld weiterleiten
- SingleLineEdit::KeyInput( rEvt );
- }
-
- Normalerweise wird die Prüfung auf gültige Eingaben im Click-Handler
- des OK-Buttons durchgeführt. Diese Lösung hat gegenüber Ihrer Lösung
- den Vorteil, daß der Anwender den Cancel-Button aktivieren kann und
- noch in andere Applikationen wechseln kann.
-
-
- F: Unter Windows ist es möglich, Edit-Controls ein Flag für Paßwort-
- eingabe zu übergeben. Dies ist in StarView nicht möglich. Wie
- kann ich dies auch zur Not systemabhängig implementieren ?
- A: StarView bietet über die Sysdepen-Klasse die Möglichkeit an, auf
- Window-Handles zurückzugreifen. Damit ist es möglich, verschiedene
- Windows-Funktionen systemabhängig zu nutzen:
-
- SetWindowLong( Sysdepen::GethWnd( aMyWin ), GWL_STYLE, ... );
- GetWindowWord( Sysdepen::GethWnd( aMyWin ), GWW_ID );
-
- Falls Ihnen noch verschiedene Funktionen in StarView fehlen, teilen
- Sie uns das bitte weiterhin mit, da StarView auch in Zukunft um
- neue Funktionen erweitert wird.
-
-
- F: Unter Windows ist die Speicherverwaltung kompliziert zu benutzen. Wie
- wird unter StarView der Speicher verwaltet oder muß ich die Windows-
- Funktionen benutzen.
- A: StarView benutzt einen eigenen Memory-Manager, der das new und delete
- des C++-Compilers ersetzt. Lesen Sie bitte dazu den Punkt Wichtige
- Informationen in der Datei README.TXT.
-
-
- F: Wenn ich den Resource Compiler aufrufe, bekomme ich die Fehlermeldung,
- das der Compiler nicht genuegend Speicher hat.
- A: Falls Sie den Borland-Compiler benutzen, müssen Sie darauf achten, das
- Sie MAKER benutzen und nicht MAKE. Außerdem sollten Sie die
- Environment-Variable DOS16M auf den richtigen Wert (siehe Datei
- readme.txt) setzen, wenn Sie den RSC2Z verwenden.
-
-
- F: Ich bekomme Link-Fehler. Was könnte ich falsch gemacht haben ?
- A: Haben Sie die SV.LIB oder die TOOLS.LIB dazugelinkt ?
- Haben Sie mit den richtigen Schaltern übersetzt, da einige
- Schalter auf das Namemangling Auswirkungen haben ?
- Haben Sie eine globale Instanz von Ihrer Applikationsklasse angelegt ?
-
-
- F: Beim Anlegen neuer Project-Files für Borland 3.0 erhalte ich beim Linken
- der Applikation "unresolved Externals".
- A: Da in der Borland-Umgebung bestimmte Switches und Parameter eingestellt
- werden, ist es am einfachsten eine bestehende Projektdatei zu kopieren,
- die alten Einträge zu löschen und die neuen Einträge aufzunehmen.
-